package com.itheima.tlias.ExcelUtils;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.fastjson2.JSON;
import com.itheima.tlias.mapper.StudentMapper;
import com.itheima.tlias.pojo.Student;
import lombok.extern.slf4j.Slf4j;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 读取Excel数据的数据监听
 * @Author mr.luo
 * @Date 12 4月 2025 14:06
 */
@Slf4j
// 有个很重要的点 DemoDataListener 不能被spring管理， 要每次读取excel都要new,然后里面用到spring可以构造方法传进去
public class DemoDataListener implements ReadListener<Student> {
    //导入一个泛型的Dao
    private StudentMapper studentMapper;
    private Integer clazzId;
    /**
     * 每隔5条存储数据库，实际使用中可以100条，然后清理list ，方便内存回收
     * Adding dependency on module 'tlias-web-management' will introduce circular dependency between modules 'tilas-utils' and 'tlias-web-management'. Add dependency anyway?
     */
    private static final int BATCH_COUNT = 100;
    /**
     * 缓存的数据
     */
    private List<Student> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
    /**
     * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
     *
     * @param
     */
    public DemoDataListener(StudentMapper studentMapper, Integer clazzId) {
        this.studentMapper = studentMapper;
        this.clazzId = clazzId;
    }
    @Override
    public void invoke(Student student, AnalysisContext analysisContext) {
        log.info("解析到一条数据:{}", JSON.toJSONString(student));
        student.setClazzId(clazzId);
        student.setCreateTime(LocalDateTime.now());
        student.setUpdateTime(LocalDateTime.now());
        // 设置学生性别excel中的性别是男，则gender设置为1，否则设置为0
        //将excel文档中的是否来自院校改成如果是isCollege设置成1，不是的话设置成0

        cachedDataList.add(student);
        // 达到BATCH_COUNT了，需要去存储一次数据库，防止数据几万条数据在内存，容易OOM
        if (cachedDataList.size() >= BATCH_COUNT) {
            studentMapper.batchInsert(cachedDataList,clazzId);
            // 存储完成清理 list
            cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
        }
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        // 这里也要保存数据，确保最后遗留的数据也存储到数据库
        studentMapper.batchInsert(cachedDataList,clazzId);
        log.info("所有数据解析完成！");
    }
}
